﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace bll
{
    /// <summary>
    /// clsUserCollection: Verwalten der Menge von clsUser-Objekten
    /// </summary>
 
    public class clsUserCollection
    {
        string _databaseFile;   // String zur Access-Datei, wird im Konstruktor initialisiert
 
        /// <summary>
        /// User-Collection Konstruktor 
        /// </summary>
        public clsUserCollection() 
        {   
            // hier wird der Pfad zur Access-Datei aus web.config gelesen
            _databaseFile = System.Configuration.ConfigurationManager.AppSettings["AccessFileName"];
        }

        /// <summary>
        /// Liest alle User aus der DB und gibt sie als Liste zurück
        /// </summary>
        /// <returns></returns>
        public List<clsUser> getAllUsers()
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllUsers");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsUser> _myUserList = new List<clsUser>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                clsUser _myUser = new clsUser();
                //und hier die Daten nach Index
                _myUser.ID = (int)_dr["UID"];
                _myUser.Title = (String)_dr["UTitle"];
                _myUser.Name = (String)_dr["UName"];
                _myUser.Position = (String)_dr["UPosition"];
                _myUser.InternalHourlyRate = (int)_dr["UInternalHourlyRate"];
                _myUser.Email = (String)_dr["UEmail"];
                _myUserList.Add(_myUser);
            }
            return _myUserList;
        } //getAllUsers() 

        /// <summary>
        /// Update eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls Update erfolgreich </returns>
        public int UpdateUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Access-Query)
            _myProvider.AddParam("Name", _User.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Position", _User.Position, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("InternalHourlyRate", _User.InternalHourlyRate, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("ID", _User.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Title", _User.Title, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Email", _User.Email, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserUpdateById");

            return _changedSets;
        } //updateUser()

        /// <summary>
        /// Löschen eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls delete erfolgreich </returns>
        public int DeleteUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Übergabeparameter ID hinzufügen 
            _myProvider.AddParam("ID", _User.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserDeleteById");

            return _changedSets;
        } //deleteUser()

        /// <summary>
        /// Insert eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt</param>
        /// <returns>1 falls Insert erfolgreich </returns>
        public int InsertUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Acess-Query)
            _myProvider.AddParam("Title", _User.Title, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Name", _User.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Position", _User.Position, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("InternalHourlyRate", _User.InternalHourlyRate, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("LoginPW", _User.LoginPw, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Email", _User.Email, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserInsert");

            return _changedSets;
        } //updateUser()

        /// <summary>
        /// Gibt User nach einer ID zurück
        /// </summary>
        /// <param name="_id">ID des gesuchten Users</param>
        /// <returns>User-Objektt (oder NULL) </returns>
        public clsUser GetUserById(int _id)
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", _id, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetUserById");

            //füllen wir eine DataTable mit dem DataSet
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            clsUser _myUser = new clsUser();
            _myUser.ID = (int)_dr["UID"];
            _myUser.Name = (String)_dr["UName"];
            _myUser.Position = (String)_dr["UPosition"];
            _myUser.InternalHourlyRate = (int)_dr["UInternalHourlyRate"];
            _myUser.Email = (String)_dr["UEmail"];

            return _myUser;
        } // getUserbyId()

        /// <summary>
        /// Zählt Anzahl users via SQL-Abfrage
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public int CountUsers1()
        {
            int _count;

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QCountUsers");

            //das Ergebnis von QCountUsers ist eine Tabelle mit einer Zeile und einer Spalte
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            _count = (int)_dr[0];

            return _count;
        } // CountUsers1()

        /// <summary>
        /// Zählt Anzahl Users, indem erst alle eingelesen werden und dann Länge der Liste zurückgegeben wird
        /// (alternative Methode zu CountUser1())
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public int CountUsers2()
        {
            int _count;
            List<clsUser> _UserList;

            _UserList = getAllUsers();
            _count = _UserList.Count;

            return _count;
        } // CountUsers2()

        /// <summary>
        /// Gibt nach vergleich mit den Parametern die Daten eines User wieder (Login Funktion)
        /// </summary>
        /// <param name="_txtName"></param>
        /// <param name="_txtPW"></param>
        /// <returns>Userdaten</returns>
        public clsUser compareLogins(String _txtName, String _txtPW)
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("LoginName", _txtName, DAL.DataDefinition.enumerators.SQLDataType.FULLTEXT);
            _myProvider.AddParam("LoginPW", _txtPW, DAL.DataDefinition.enumerators.SQLDataType.FULLTEXT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetUserData");

            //füllen wir eine DataTable mit dem DataSet
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            clsUser _myLogin = new clsUser();

            _myLogin.ID = (int)_dr["UId"];
            _myLogin.Name = (String)_dr["UName"];
            _myLogin.LoginPw = (String)_dr["LoginPW"];
            _myLogin.Position = (String)_dr["UPosition"];
            //_myLogin.;

            return _myLogin;
        } // compareLogins()


        /// <summary>
        /// Gibt den Usernamen nach der session-id für die Willkommensnamen aus.
        /// </summary>
        /// <param name="_id">ID des gesuchten Users</param>
        /// <returns>User-Objektt (oder NULL) </returns>
        public clsUser GetUserNameBySessionId()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", bll.clsUser.Session, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetUserById");

            //füllen wir eine DataTable mit dem DataSet
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            clsUser _myUser = new clsUser();
            _myUser.ID = (int)_dr["UID"];
            _myUser.Title = (String)_dr["UTitle"];
            _myUser.Name = (String)_dr["UName"];
            _myUser.Position = (String)_dr["UPosition"];
            _myUser.InternalHourlyRate = (int)_dr["UInternalHourlyRate"];
            _myUser.Email = (String)_dr["UEmail"];

            return _myUser;
        } // getUserbyId()

        /// <summary>
        /// Liest alle Usernamen aus der DB
        /// </summary>
        /// <returns></returns>
        public List<clsUser> getUserName()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllUsers");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsUser> _myUserList = new List<clsUser>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                clsUser _myUser = new clsUser();
                //und hier die Daten nach Index
                _myUser.Name = (String)_dr["UName"];
                _myUserList.Add(_myUser);
            }
            return _myUserList;
        } //getAllUsers() 


        public clsUser GetUserByPosition(String _position)
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("Position", _position, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetUserByPosition");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            clsUser _myUser = new clsUser();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen User
                //und hier die Daten nach Index 
                _myUser.ID = (int)_dr["UID"];
                _myUser.Title = (String)_dr["UTitle"];
                _myUser.Name = (String)_dr["UName"];
                _myUser.Position = (String)_dr["UPosition"];
                _myUser.InternalHourlyRate = (int)_dr["UInternalHourlyRate"];
                _myUser.Email = (String)_dr["UEmail"];
            }
            return _myUser;

        } // getUserbySession()

    }
}
